package team.bluepen.supermarket.service.recommend.core;

import team.bluepen.supermarket.service.recommend.dto.RelateDTO;

import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 核心算法
 *
 * @author YCB 2023/6/19 15:01
 */
public class ItemCF {

    /**
     * 方法描述: 推荐电影id列表
     *
     * @param itemId 当前电影id
     * @param list   用户电影评分数据
     * @return {@link List<Integer>}
     */
    public static List<Long> recommend(Long itemId, List<RelateDTO> list) {
        // 按电影分组: 每一个元素都是同一电影的不同用户评价
        Map<Long, List<RelateDTO>> itemMap = list.stream()
                .collect(Collectors.groupingBy(RelateDTO::getItemId));

        // 获取其他物品与当前物品的关系值：计算物品之间的相似度
        Map<Long, Double> itemDisMap = CoreMath.computeNeighbor(itemId, itemMap, 1); // 类型1: 基于物品推荐

        // 获取关系最近物品（最相似的物品）
        double maxValue = Collections.max(itemDisMap.values());
        return itemDisMap.entrySet()
                .stream()
                .filter(e -> e.getValue().equals(maxValue))
                .map(Map.Entry::getKey)
                .collect(Collectors.toList());
    }


}
